home *** CD-ROM | disk | FTP | other *** search
- /*
- Troff2Text
- EvenMore FileIO plugin
- Author: Chris Perver
- Copyright (c) 2001
- */
-
-
- OPT REG=5
-
- LIBRARY 'troff2text.plugin',1,1,'Troff2Text 1.04' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
-
- MODULE 'tools/ctype', '*epo'
-
- DEF mem2:PTR TO CHAR, count2 =0, ww= TRUE, wordwrap = 80
-
-
- PROC em_isdatatype(bf, bl)
- DEF pos = 0, rs = FALSE, working = TRUE
-
- WHILE working
- IF Long(bf + pos) = ".TH "
- working := FALSE
- rs := TRUE
- ENDIF
-
- WHILE bf[pos] <> "\n" DO INC pos
- INC pos
-
- IF pos >= bl THEN working := FALSE
- ENDWHILE
- ENDPROC rs
-
- PROC em_parsedata(epo:PTR TO em_pluginobj)
- DEF memadr:PTR TO CHAR, lenadr, len2
- DEF count = 0
- DEF notdone = TRUE
-
- DEF man[256]:STRING, cchar = 0 ->, notdonewrapping = FALSE
- DEF lineend
-
- memadr := epo.buffer
- lenadr := epo.length
-
- mem2 := epo.nbuffer
- len2 := epo.nlength
-
- mem2[len2] := "\n"
-
- WHILE notdone AND (count < lenadr)
- lineend := count
- WHILE memadr[lineend] <> "\n" DO INC lineend
- INC lineend
-
-
- SELECT 256 OF memadr[count]
- CASE "."
- IF (count = 0) OR (memadr[count-1] = "\n")
-
- StrCopy(man, memadr + count, 10)
- SELECT 256 OF memadr[count+1]
- CASE "b", "B"
-
- -> LINEBREAK
- IF InStr(man, '.br') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
-
- -> BOLD
- ELSEIF InStr(man, '.B ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "1"
- mem2[count2++] := "m"
- count := count + 3
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- -> BOLDITALIC
- ELSEIF InStr(man, '.BI ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "1"
- mem2[count2++] := "m"
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- -> BOLDROMAN
- ELSEIF InStr(man, '.BR ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "1"
- mem2[count2++] := "m"
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
- ELSE
- count := lineend
- ENDIF
- CASE "i", "I"
-
- -> ITALIC
- IF InStr(man, '.I ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "3"
- mem2[count2++] := "m"
- count := count + 3
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- -> ITALIC ROMAN
- ELSEIF InStr(man, '.IR ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "3"
- mem2[count2++] := "m"
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- -> ITALIC BOLD
- ELSEIF InStr(man, '.IB ') = 0
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "3"
- mem2[count2++] := "m"
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- -> PARAGRAPH
- ELSEIF InStr(man, '.IP') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- mem2[count2++] := "\t"
- cchar := 1
- count := count + 4
- ELSE
- count := lineend
- ENDIF
-
- CASE "l", "L"
- IF InStr(man, '.LP') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- count := count + 4
- cchar := 0
- ELSE
- count := lineend
- ENDIF
-
- CASE "S"
-
- -> SECTION HEADING INDENTED BOLD
- IF InStr(man, '.SH') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- mem2[count2++] := "\t"
- cchar := 1
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "1"
- mem2[count2++] := "m"
-
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
-
- -> SECTION HEADING BOLD
- ELSEIF InStr(man, '.SS') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "1"
- mem2[count2++] := "m"
-
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\e"
- mem2[count2++] := "["
- mem2[count2++] := "0"
- mem2[count2++] := "m"
-
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
-
- ELSE
- count := lineend
- ENDIF
- CASE "T"
-
- -> HEADER
- IF InStr(man, '.TH') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
- count := count + 4
-
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- cchar := 0
- ELSEIF InStr(man, '.TP') = 0
- mem2[count2++] := "\n"
- mem2[count2++] := "\n"
- mem2[count2++] := "\t"
- cchar := 1
- count := count + 4
- ELSE
- count := lineend
- ENDIF
- DEFAULT
- count := lineend
- ENDSELECT
- ELSE
- mem2[count2++] := memadr[count++]
- INC cchar
- ENDIF
-
- DEFAULT
- count, count2, cchar := parseescapecodes(memadr, count, lineend, mem2, count2, cchar)
-
- ENDSELECT
- ENDWHILE
- -> count2 := count2 - 120
- ENDPROC mem2, count2
- -><
-
- PROC parseescapecodes(m, c, l, m2, c2, cc)
- DEF notdonewrapping = FALSE, oldpos, newcc = 0
-
- WHILE (c < l)
- SELECT 256 OF m[c]
- -> \
- CASE $5C
- SELECT 256 OF m[c+1]
- -> INTERPOLATE TEXT
- CASE "w"
- c := l
-
- -> $ MACRO ARGS
- CASE "$"
- c := l
-
- -> \
- CASE $5C
- INC c
-
- -> PRINT ESC CHAR
- CASE "e"
- m2[c2++] := $5C
- INC cc
- c := c + 2
-
- -> ZERO WIDTH SPACE
- CASE "&"
- c := c + 2
-
- -> COMMENT
- CASE $22
- c := l
-
- -> DASH
- CASE "-"
- INC c
-
- -> TAB
- CASE "t"
- m2[c2++] := "\t"
- INC cc
- c := l
- DEFAULT
- m2[c2++] := m[c++]
- INC cc
- ENDSELECT
-
- -> EOL
- CASE "\b", "\n"
- -> MAKE SURE WE HAVE A SPACE BEFORE THE NEXT SENTENCE
- IF m[c] = "\n"
- m2[c2++] := " "
- INC cc
- ENDIF
- INC c
-
- DEFAULT
-
- m2[c2++] := m[c++]
- INC cc
-
-
- IF ww = TRUE
- IF (cc >= wordwrap) AND (c < l)
- oldpos := c2
-
- notdonewrapping := TRUE
- WHILE notdonewrapping
- m2[oldpos+1] := m2[oldpos]
-
- IF isspace(m2[oldpos-1]) = FALSE
- DEC oldpos
- DEC newcc
- ELSE
- m2[oldpos] := "\n"
-
- c2++
- cc := (c2 - oldpos)
- notdonewrapping := FALSE
- -> WriteF('1')
- ENDIF
- ENDWHILE
- ENDIF
- ENDIF
-
- ENDSELECT
- ENDWHILE
- ENDPROC c, c2, cc
-
- -> *** STANDARD PROCS FOR PLUGINS
-
-
- PROC em_begin(epo:PTR TO em_pluginobj)
- IF em_isdatatype(epo.buffer, epo.length)
- RETURN "MEM", (epo.length * 2)
- ELSE
- RETURN FALSE
- ENDIF
- ENDPROC
-
- PROC em_main(epo:PTR TO em_pluginobj)
- DEF m2, l2
- m2, l2 := em_parsedata(epo)
- epo.nlength := l2
- RETURN TRUE
- ENDPROC
-
- PROC em_end() IS EMPTY
-
- PROC em_info() IS 'Troff2Text 1.04'
-
- PROC em_pluginid() IS "FILE"
-
- PROC em_format() IS 'Troff'
-
- PROC main() IS EMPTY
-